package org.moonlight.jvm.instructions.stores.xastore;

import org.moonlight.jvm.rtda.exclusive.Frame;
import org.moonlight.jvm.rtda.exclusive.OperandStack;
import org.moonlight.jvm.rtda.share.Object;

/**
 * b_a_store指令: 按索引给数组元素赋值( byte类型 或者 boolean类型 )
 *
 * @author Moonlight
 * @createTime 2023/9/15 15:10
 **/
public class BAStore extends XAStore {

    @Override
    public void execute(Frame frame) {
        // 操作数栈
        OperandStack stack = frame.getOperandStack();
        // 要赋给数组元素的值
        int val = stack.popInt();
        // 数组索引
        int idx = stack.popInt();
        // 数组引用
        Object arrRef = stack.popRef();
        // 检查数组引用是否为null
        checkNotNull(arrRef);
        // 转为数组类型
        byte[] bytes = arrRef.bytes();
        // 检查数组下标是否越界
        checkIndex(bytes.length, idx);
        // 给数组元素赋值
        bytes[idx] = (byte) val;
    }

}
